package com.cyf.xjtech_android;

import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer;

public interface XJTechLibrary extends Library {
    public static final String JNA_LIBRARY_NAME = "xjtech";
    public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(XJTechLibrary.JNA_LIBRARY_NAME);
    public static final XJTechLibrary INSTANCE = (XJTechLibrary) Native.load(XJTechLibrary.JNA_LIBRARY_NAME, XJTechLibrary.class); //直接加载第三方动态库

    //定义接口AppCallback，继承自com.sun.jna.Callback
    public interface PUPLOAD_DATA_CALLBACK extends Callback {
        void callback(Pointer pImage, X_TEMPR_INFO pMaxTemprInfo, X_TEMPR_INFO pMinTemprInfo,
                      X_ALARM_LINDED_AREA pAlarmLinkedArea, int iAlarmAreaCount, Pointer pAlarmMask, Pointer pUserData);
    }

    /**
     * 初始化红外设备
     *
     * @param type  设备类型
     * @param param 设备参数
     * @return iUserId 设备唯一标识，后续其它操作都需要
     */
    int XJTech_Init(int type, X_DEVICE_PARAM param);

    /**
     * 绑定本地网卡
     *
     * @param strLocalIpAddr 本地IP地址
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_BindToPhyNetCard(String strLocalIpAddr);

    /**
     * 打开红外设备
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param param     设备网络信息
     * @param callback  数据回调函数
     * @param pUserData 用户指针
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_Open(int iUserId, X_DEVICE_INFO param, PUPLOAD_DATA_CALLBACK callback, Pointer pUserData);

    /**
     * 重连红外设备
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param pDeviceInfo 设备网络信息
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_Reconnect(int iUserId, X_DEVICE_INFO pDeviceInfo);

    /**
     * 获取设备运行状态
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @return 是否运行
     */
    boolean XJTech_IsRunning(int iUserId);

    /**
     * 关闭设备
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_Close(int iUserId);

    /**
     * 卸载红外设备
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_UnInit(int iUserId);

    /**
     * 更改红外色带
     *
     * @param iUserId       设备唯一标识，初始化设备时返回
     * @param iPaletteIndex 色带标号
     */
    void XJTech_ChangePalette(int iUserId, int iPaletteIndex);

    /**
     * 非均匀性校正
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_DoFFC(int iUserId);

    /**
     * 快门校正
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_Shutter(int iUserId);

    /**
     * 调焦
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_Focus(int iUserId);

    /**
     * 根据坐标点获取温度
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param iX      x坐标
     * @param iY      y坐标
     * @return 温度值
     */
    float XJTech_GetTemprByPoint(int iUserId, int iX, int iY);

    /**
     * 获取矩形区域温度
     *
     * @param iUserId    设备唯一标识，初始化设备时返回
     * @param pRect      矩形坐标
     * @param pTemprInfo 温度数据
     */
    void XJTech_GetRectangleTemptr(int iUserId, X_RECT pRect, X_TEMPR_INFO pTemprInfo);

    /**
     * 获取矩形区域温度
     *
     * @param iUserId    设备唯一标识，初始化设备时返回
     * @param pRect      矩形坐标
     * @param pTemprInfo 温度数据
     * @param fRatio     比率
     */
    void XJTech_GetRectangleTemptr(int iUserId, X_RECT pRect, X_TEMPR_INFO pTemprInfo, float fRatio);

    /**
     * 获取焦平面温度
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @return 温度值
     */
    int XJTech_GetFPATempr(int iUserId);

    /**
     * 获取黑体基准温度
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @return 温度值
     */
    float XJTech_GetBlackBodyBaseTempr(int iUserId);

    /**
     * 设置黑体基准温度
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param fTempr  黑体温度
     * @return 成功 >= 0; 失败 <0
     */
    boolean XJTech_SetBlackBodyBaseTempr(int iUserId, float fTempr);

    /**
     * 获取黑体校正温度
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @return 温度值
     */
    float XJTech_GetBlackBodyCorrTempr(int iUserId);

    /**
     * 体表温度转腋下温度
     *
     * @param iUserId       设备唯一标识，初始化设备时返回
     * @param fSurfaceTempr 体表温度
     * @return 腋下温度
     */
    float XJTech_SurfaceTemprToArmpitTempr(int iUserId, float fSurfaceTempr);

    /**
     * 设置屏蔽区域
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pArea   屏蔽的区域网格
     * @param iSize   网格大小
     */
    void XJTech_SetShieldArea(int iUserId, byte[] pArea, int iSize);

    /**
     * 设置黑体区域
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pRegion 黑体位置
     * @param iSize   大小
     */
    void XJTech_SetBlackBodyRegion(int iUserId, byte[] pRegion, int iSize);

    /**
     * 设置温度曲线
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pCurve  温度曲线
     * @param iSize   大小
     */
    void XJTech_SetTemprCurve(int iUserId, byte[] pCurve, int iSize);

    /**
     * 设置测温模式
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param eMode   测温模式
     */
    void XJTech_SetMeasureMode(int iUserId, X_MEASURE_MODE eMode);

    /**
     * 设置手动温度矫正值
     *
     * @param iUserId  设备唯一标识，初始化设备时返回
     * @param fCorrect 矫正温度
     */
    void XJTech_SetManualTemprCorrect(int iUserId, float fCorrect);

    /**
     * 设置距离温度矫正值
     *
     * @param iUserId  设备唯一标识，初始化设备时返回
     * @param fCorrect 矫正温度
     */
    void XJTech_SetDistanceTemprCorrect(int iUserId, float fCorrect);

    /**
     * 设置报警最小像素值
     *
     * @param iUserId              设备唯一标识，初始化设备时返回
     * @param iAlarmMinPixelsValue 像素值
     */
    void XJTech_SetAlarmMinPixelsValue(int iUserId, int iAlarmMinPixelsValue);

    /**
     * 设置报警等级
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param pAlarmLevel 报警等级
     */
    void XJTech_SetAlarmLevel(int iUserId, X_ALARM_LEVEL pAlarmLevel);

    /**
     * 设置亮度
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param iBrightness 亮度
     */
    void XJTech_SetBrightness(int iUserId, int iBrightness);

    /**
     * 设置对比度
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param iContrast 对比度
     */
    void XJTech_SetContrast(int iUserId, int iContrast);

    /**
     * 设置增益模式
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param bGainMode 是否开启增益
     */
    void XJTech_SetGainMode(int iUserId, boolean bGainMode);

    /**
     * 设置平台调光参数
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pParam  调光参数
     */
    void XJTech_SetPlatDimmerParam(int iUserId, PlatHistDimmerParam pParam);

    /**
     * Gamma矫正
     *
     * @param iUserId          设备唯一标识，初始化设备时返回
     * @param iGammaTableIndex Gamma矫正值
     */
    void XJTech_GammaCorrection(int iUserId, int iGammaTableIndex);

    /**
     * 开启黑体模式校正模式
     *
     * @param iUserId    设备唯一标识，初始化设备时返回
     * @param bBdCorrect 是否开启黑体矫正
     */
    void XJTech_StartBdCorrectMode(int iUserId, boolean bBdCorrect);

    /**
     * 设置屏蔽区域网格尺寸
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param iHorGridNum 水平方向网格数量
     * @param iVerGridNum 垂直方向网格数量
     */
    void XJTech_SetShieldGridSize(int iUserId, int iHorGridNum, int iVerGridNum);

    /**
     * 三点匹配校正矩阵
     *
     * @param irPointF       红外三个点坐标
     * @param vlPointF       可见光三个点坐标
     * @param TransformMatrix 转换矩阵二维数组
     * @return 成功或者失败
     */
    boolean XJTech_GetTransformMatrix(X_PT[] irPointF, X_PT[] vlPointF, double[][] TransformMatrix);

    /**
     * 机芯升级
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param strFileName 升级文件名称
     * @param ucType      类型
     * @param ucIsReboot  是否重启
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_UpdateProgram(int iUserId, String strFileName, byte ucType, byte ucIsReboot);

    /**
     * FPGA升级
     *
     * @param iUserId     设备唯一标识，初始化设备时返回
     * @param strFileName 升级文件名称
     * @param ucFileType  类型
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_UpdateFPGA(int iUserId, String strFileName, byte ucFileType);

    /**
     * 获取机芯软件版本号
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param uiVersion 版本
     * @param uiDate    日期
     * @return 成功 >= 0; 失败 <0
     */
    int XJTech_GetDeviceSoftwareVersion(int iUserId, int[] uiVersion, int[] uiDate);

    /**
     * 激活本底图像校正功能
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param bEnable 是否开启
     */
    void XJTech_EnableBackgroundCorrect(int iUserId, boolean bEnable);

    /**
     * 采集本底
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     */
    void XJTech_CaptureBackground(int iUserId);

    /**
     * 透明通道
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param emCmdType 类型
     * @param pData     数据
     * @param iSize     长度
     */
    void XJTech_SerialSend(int iUserId, X_SERIAL_CMD_TYPE emCmdType, String pData, int iSize);

    /**
     * 启用/禁用黑体防遮挡算法
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param bEnable 是否启用
     */
    void XJTech_EnableBlackBodyAvoidCover(int iUserId, boolean bEnable);

    /**
     * 获取设备环境数据
     *
     * @param iUserId  设备唯一标识，初始化设备时返回
     * @param pBuffer  数据
     * @param uiLength 数据
     * @return 成功或者失败
     */
    boolean XJTech_GetDeviceEnvData(int iUserId, byte[] pBuffer, int[] uiLength);

    /**
     * 启用/禁用环境温度矫正
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param bEnable 是否启用
     */
    void XJTech_EnableEnvTemprCorrect(int iUserId, boolean bEnable);

    /**
     * 获取环境参数
     *
     * @param iUserId   设备唯一标识，初始化设备时返回
     * @param pEnvParam 环境参数
     */
    void XJTech_GetEnvParam(int iUserId, X_ENV_PARAM pEnvParam);

    /**
     * 获取原始测温数据
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pData   测温数据
     */
    void XJTech_GetSrcTemperatureData(int iUserId, short[] pData);

    /**
     * 激活/禁用时域滤波算法
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param bEnable 是否启用
     */
    void XJTech_EnableTimeDomainFilteringAlgo(int iUserId, boolean bEnable);

    /**
     * 设置时域滤波算法参数
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pParam  滤波算法参数
     */
    void XJTech_SetTimeDomainFilteringAlgoParam(int iUserId, XTimeDomainFilteringParam pParam);

    /**
     * 激活/禁用双边滤波算法
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param bEnable 是否启用
     */
    void XJTech_EnableBilateralFilteringAlgo(int iUserId, boolean bEnable);

    /**
     * 设置双边滤波算法参数
     *
     * @param iUserId 设备唯一标识，初始化设备时返回
     * @param pParam  双边滤波算法参数
     */
    void XJTech_SetBilateralFilteringAlgoParam(int iUserId, XBilateralFilteringParam pParam);

}


